from app.config.settings import settings
from app.models.device import DeviceInfo


from fastmcp import FastMCP
from typing import Optional, List, Dict, Any
from app.util.logger import Logger, setup_logging, get_logger
from app.service.service import get_iot_service

# 初始化 loguru 日志系统
logger: Logger = setup_logging(settings.log_level)

# 创建 FastMCP 实例
mcp = FastMCP("iot-mcp")

# 获取服务实例
iot_service = get_iot_service()


@mcp.tool()
def get_device_list(
    place_name: Optional[str] = None,
    state: Optional[str] = None,
    device_type: Optional[str] = None,
) -> List[DeviceInfo]:
    """
    根据指定的条件过滤并获取设备列表

    Args:
        place_name: 设备所在位置名称（可选），如：客厅、卧室、厨房等
        state: 设备状态（可选），如：online、offline、maintenance
        device_type: 设备类型（可选），如：temperature_sensor、smart_light、air_quality_sensor、smart_lock

    Returns:
        符合条件的设备列表，每个设备包含 id、name、place_name、state、device_type、last_update、data 等信息
    """
    try:
        # 委托给服务层处理，现在返回 List[DeviceInfo]
        device_list: List[DeviceInfo] = iot_service.get_device_list(
            place_name=place_name, state=state, device_type=device_type
        )

        return device_list

    except Exception as e:
        logger.error(f"❌ MCP 工具函数执行失败: {str(e)}")
        logger.exception("详细错误信息")
        raise


@mcp.tool
def control_device(
    device_nos: List[str],
    action: str,
) -> str:
    """
    控制设备工具函数

    Args:
        device_nos: 设备编号列表
        action: 控制动作
    Returns:
        控制结果, success or fail
    """
    logger.info(f"🛠️  执行控制设备工具函数: {device_nos} {action}")
    return "控制成功"


def main():
    logger.info("✨ IoT MCP 服务器启动中...")
    logger.info("🛠️  可用的工具函数:")
    logger.info("   - get_device_list: 根据位置、状态、设备类型过滤设备列表")
    logger.info("   - control_device: 控制设备")

    try:
        # 运行 MCP 服务器
        logger.info(f"🚀 正在启动 MCP 服务器，监听地址: http://{settings.host}:{settings.port}")
        mcp.run(transport="http", host=settings.host, port=settings.port)
    except KeyboardInterrupt:
        logger.info("ℹ️  接收到停止信号，正在关闭服务器...")
    except Exception as e:
        logger.error(f"❌ 服务器启动失败: {str(e)}")
        logger.exception("详细错误信息")
        raise
    finally:
        logger.info("🔄 IoT MCP 服务器已关闭")


if __name__ == "__main__":
    main()
